package cn.good.yan.service.t2;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

/**
 * 2. CompletableFuture 定义操作 - 异步任务
 * 异步回掉 -  applyToEither：A任务 和 B任务 争抢，抢到了就执行谁的 返回值
 *
 * @author shengren.yan
 * @create 2024-03-25
 */
public class CompletableFuture6 {
    public static void main(String[] args) {
        // A 任务，执行逻辑，返回值：playA  （代码运行3秒）
        CompletableFuture<String> playA = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "【A】--子线程 - 任务正在执行");
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "playA";
        });
        // B 任务，执行逻辑，返回值：playB  （代码运行1秒）
        CompletableFuture<String> playB = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "【B】--子线程 - 任务正在执行");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "playB";
        });
        // A任务、B任务 之间争抢，看谁先执行。（参数：最先执行完的任务的返回值）
        CompletableFuture<String> result = playA.applyToEither(playB, f -> {
            return f + " 任务执行了，另一个任务没有执行";
        });
        // 最终的返回结果，result的
        System.out.println(Thread.currentThread().getName() + "\t" + "-----: " + result.join());
    }
}
